package cn.zyb.controller;
import cn.zyb.domain.User;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author zyb
 * @version 1.0.0
 * @date 2022年08月04日 16:50:06
 * @packageName cn.zyb.controller
 * @className OrderController
 * @describe TODO
 */
@RestController
@DefaultProperties(defaultFallback = "fallbackMethod")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getById/{id}")
    @HystrixCommand // 标记方法熔断，fallbackMethod指定的是托底方法名称，当远程服务调用出现异常，或是方法本身出现异常，会触发托底方法
    public User getUserById(@PathVariable("id") Long id){
        // 1.定义要请求的路径，后续不会如此使用
        String url = "http://user-server/getById/"+id;
        // 2.使用RestTemplate工具类发送Http请求调用User接口
        return restTemplate.getForObject(url, User.class);
    }

    // 方法独立托底方法
    /*
        1.方法名称必须和fallbackMethod指定的方法名称一致
        2.方法的返回值和参数必须跟熔断方法一致
     */
    /*public User fallbackGetById(@PathVariable("id") Long id){
        return new User(-1L, "触发熔断", "服务被熔断了，不可调用，请稍后重试！");
    }*/

    // 接口类统一托底方法，不管是统一还是接口局部托底返回值类型都需要一致
    public Object fallbackMethod(){
        return new User(-1L, "触发熔断", "熔断触发了！！！");
    }

}
